﻿using LibQuestionIsPhone.Models;
using Microsoft.Phone.Controls;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;
using System.Windows.Navigation;

namespace InterviewAppPhone.Views
{
    public partial class Domande : PhoneApplicationPage
    {
        public Domande()
        {
            InitializeComponent();
            DataContext = App.DomandeViewModel;
        }

        void InizioPartitaEvent(object sender, EventArgs e)
        {
            Start.Begin();
        }

        void Start_Completed(object sender, EventArgs e)
        {
            App.DomandeViewModel.InizioPartita();
        }

        // Caricare i dati per gli elementi ViewModel
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            while (App.RootFrame.BackStack.Count() > 0)
                App.RootFrame.RemoveBackEntry();
            if (!App.DomandeViewModel.IsDataLoaded)
            {
                App.DomandeViewModel.LoadData();
            }
            Start.Completed += Start_Completed;
            App.DomandeViewModel.InizioPartitaEvent += InizioPartitaEvent;
            StEsitoRisposta.Completed += StEsitoRisposta_Completed;
            App.DomandeViewModel.FinePartitaEvent += Domande_FinePartitaEvent;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            App.DomandeViewModel.InizioPartitaEvent -= InizioPartitaEvent;
            StEsitoRisposta.Completed -= StEsitoRisposta_Completed;
            Start.Completed -= Start_Completed;
            App.DomandeViewModel.FinePartitaEvent -= Domande_FinePartitaEvent;

            base.OnNavigatedFrom(e);
        }
        protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            base.OnBackKeyPress(e);
            MessageBoxResult esito = MessageBox.Show("Attenzione! Proseguendo uscirai dall'applicazione. Si vuole procedere? ", "", MessageBoxButton.OKCancel);
            switch (esito)
            {
                case MessageBoxResult.Cancel:
                    e.Cancel = true;
                    break;
                case MessageBoxResult.OK:
                    break;
                default:
                    break;
            }
        }

        public void Domande_FinePartitaEvent(object sender, EventArgs e)
        {
            App.DomandeViewModel.FinePartita();
            Dispatcher.BeginInvoke(() => { StFinePartita.Begin(); });
            //TODO creare una animazione per la fine della partita
        }

        private void LLSRisposte_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (LLSRisposte.SelectedItem == null)
                return;
            var risposta = (SingolaRisposta)LLSRisposte.SelectedItem;
            App.DomandeViewModel.SetDataRisposta(risposta);

            StEsitoRisposta.Begin();

            LLSRisposte.SelectedItem = null;
        }

        private async void StEsitoRisposta_Completed(object sender, EventArgs e)
        {
            if (!await App.DomandeViewModel.NextDomanda())
                StFinePartita.Begin();
            else
            {
                App.DomandeViewModel.RiprendiPartita();
                Start.Begin();
            }
        }

        private void btnNuovaPartita_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Views/MainPage.xaml", UriKind.Relative));
        }


        private void Risposta_Tap(object sender, System.Windows.Input.GestureEventArgs e)
        {
            var animazione = (Storyboard)((StackPanel)sender).FindName("SelectedRisposta");
            animazione.Stop();
            animazione.Begin();
        }

        private void btnRiprova_Click(object sender, RoutedEventArgs e)
        {
            App.DomandeViewModel.ResetAllData();
            NavigationService.Navigate(new Uri("/Views/Reload.xaml", UriKind.Relative));
        }

        private void btnListaPunteggi_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Views/ListaPunteggi.xaml", UriKind.Relative));
        }
    }
}